# coding=utf-8
"""
    @Author：SimpleTree
    @date：2025/4/20 22:03
    @desc: 
"""
import uuid

from django.db import models

from common.mixins.app_model_mixin import AppModelMixin
from users.models import User
from setting.models.model_management import Model


class ApplicationTypeChoices(models.TextChoices):
    """订单类型"""
    SIMPLE = 'SIMPLE', '简易'
    WORK_FLOW = 'WORK_FLOW', '工作流'


def get_dataset_setting_dict():
    return {
        'top_n': 3,
        'similarity': 0.6,
        'max_paragraph_char_number': 5000,
        'search_mode': 'embedding',
        'no_references_setting': {
            'status': 'ai_questioning',
            'value': '{question}'
        }
    }


def get_model_setting_dict():
    return {
        'prompt': Application.get_default_model_prompt(),
        'no_references_prompt': '{question}',
        'reasoning_content_start': '<think>',
        'reasoning_content_end': '</think>',
        'reasoning_content_enable': False
    }


class Application(AppModelMixin):
    id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid1, editable=False, verbose_name="主键id")
    name = models.CharField(max_length=128, verbose_name="应用名称")
    desc = models.CharField(max_length=512, verbose_name="应用描述", default="")
    prologue = models.CharField(max_length=40960, verbose_name="开场白", default="")
    dialogue_number = models.IntegerField(default=0, verbose_name="会话数量")
    user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    model = models.ForeignKey(Model, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True)
    dataset_setting = models.JSONField(verbose_name="数据集参数设置", default=get_dataset_setting_dict)
    model_setting = models.JSONField(verbose_name="模型参数设置", default=get_model_setting_dict)
    model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict)
    tts_model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict)
    problem_optimization = models.BooleanField(verbose_name="问题优化", default=False)
    icon = models.CharField(max_length=256, verbose_name="应用icon", default="/ui/favicon.ico")
    work_flow = models.JSONField(verbose_name="工作流", default=dict)
    # choices 属性是一个由元组构成的列表，每个元组包含两个元素，第一个元素是存储在数据库中的值，第二个元素是在界面上显示的可读名称。
    # default=ApplicationTypeChoices.SIMPLE：指定该字段的默认值为 ApplicationTypeChoices.SIMPLE。
    # ApplicationTypeChoices 定义了两个应用类型选项：SIMPLE 和 COMPLEX，分别对应存储在数据库中的值 'simple' 和 'complex'，以及在界面上显示的可读名称 '简单应用' 和 '复杂应用'。
    type = models.CharField(verbose_name="应用类型", choices=ApplicationTypeChoices.choices,
                            default=ApplicationTypeChoices.SIMPLE, max_length=256)
    problem_optimization_prompt = models.CharField(verbose_name="问题优化提示词", max_length=102400,
                                                   blank=True, null=True,
                                                   default="()里面是用户问题,根据上下文回答揣测用户问题({question})要求: 输出一个补全问题,并且放在<data></data>标签中")
    # related_name="tts_model_id" 指定从Model模型反向关联到当前模型时使用的名称。通过related_name，可以从Model模型的实例访问与之关联的当前模型的所有实例。
    # 例如，如果 Model 模型的一个实例为 model_instance，那么可以使用 model_instance.tts_model_id.all() 来获取所有关联的当前模型的实例。
    tts_model = models.ForeignKey(Model, related_name="tts_model_id", on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True)
    stt_model = models.ForeignKey(Model, related_name="stt_model_id", on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True)
    tts_model_enable = models.BooleanField(verbose_name="语音合成模型是否启动", default=False)
    stt_model_enable = models.BooleanField(verbose_name="语音识别模型是否启用", default=False)
    tts_type = models.CharField(verbose_name="语音播放类型", max_length=20, default="BROWSER")
    tts_autoplay = models.BooleanField(verbose_name="自动播放", default=False)
    stt_autosend = models.BooleanField(verbose_name="自动发送", default=False)
    clean_time = models.IntegerField(verbose_name="清理时间", default=180)
    file_upload_enable = models.BooleanField(verbose_name="文件上传是否启用", default=False)
    file_upload_setting = models.JSONField(verbose_name="文件上传相关设置", default=dict)

    @staticmethod
    def get_default_model_prompt():
        return ('已知信息：'
                '\n{data}'
                '\n回答要求：'
                '\n- 如果你不知道答案或者没有从获取答案，请回答“没有在知识库中查找到相关信息，建议咨询相关技术支持或参考官方文档进行操作”。'
                '\n- 避免提及你是从<data></data>中获得的知识。'
                '\n- 请保持答案与<data></data>中描述的一致。'
                '\n- 请使用markdown 语法优化答案的格式。'
                '\n- <data></data>中的图片链接、链接地址和脚本语言请完整返回。'
                '\n- 请使用与问题相同的语言来回答。'
                '\n问题：'
                '\n{question}')

    class Meta:
        db_table = 'application'
